# -*- coding: utf-8 -*-
__author__ = 'sunnychou'
__date__ = '2019/9/16 16:19'

'''
功能：
   将月数据统计表进行合并，产生大数据统计表，写成excel文件，发送邮件

采购付款单
    采购付款单

计算时间点：
    月底（最后半天）计算本月所有数据

表结构：
   采购付款单  ---  k3cgfkds
   
   
处理过程：
  1. 由月份获取当月的合并数据，返回dataframe数据集
  2. 将dataframe数据集直接写excel
  3. 发邮件(见common模块中的email_helper.py)
  
'''

#导入依赖库
from common.pandas_helper import PandasHelper
from common.utils import FVDateTime, get_month, series_value,increase_rate
import pandas as pd
from common.logger_helper import g_wlogger
from common.email_helper import email_send_with_appendix_list
from common.mssql_helper import g_msql_inst
from k3_data_report.finance.utils import fetch_lastyear_ljqk

CHTJ_DICT = {
    'k3cgfkds':"select   pjcode, sname, kqtype, pp, paytype, bydde,  byrke,byyfk, byyinfk,  byysp, wsfp, xyyjyfk, "
               "tjmonth    from  k3cgfkds where  paytype='%s' and tjmonth  BETWEEN '%s' and '%s'",
    'k3_cpgly':"select   gys, cpgly   from k3_cpgly order by sjsj desc",
}

def fetch_gys_cpgly():
    gys_list = g_msql_inst.fetch_all(CHTJ_DICT['k3_cpgly'])
    gys_cpgly_dict = {}
    for (gys, cpgly) in gys_list:
        gys_cpgly_dict[gys] = cpgly
    return gys_cpgly_dict


def generate_sql(type, begin_time, end_time, paytype='人民币'):
    target_tb_sql = CHTJ_DICT[type] % (paytype, begin_time, end_time)
    return target_tb_sql


def create_df_k3cgfkds(month=None, paytype='人民币'):
    '''
    统计采购付款单
    :param month: 输入的月份，默认是本月
    :return:
    '''
    #查询品牌，产品经理，产品助理，当月出库额，时间范围为：当年上月，去年同月，当年当前季度，去年同季度
    if month == None:
        month = get_month(FVDateTime().to_dict()['this_month_start'])

    the_year = int(month.split("-")[0])
    fvdate_dict = FVDateTime(month).to_dict()

    #本年度数据，获取所有的从今年1月份到现在本月的时间数据
    this_year_start = fvdate_dict['this_year_start']
    this_month_end = fvdate_dict['this_month_end']

    target_tb_sql = generate_sql("k3cgfkds", this_year_start, this_month_end, paytype)
    target_full_df = PandasHelper.pd_query_sql(target_tb_sql)
    if target_full_df.empty:
        g_wlogger.werror("create_df_k3cgfkds:target_full_df, all data is empty.")
        return pd.DataFrame()

    #待计算数值字段进行转换
    target_full_df[['bydde', 'byrke', 'byyfk', 'byyinfk', 'byysp', 'wsfp', 'xyyjyfk']] = \
        target_full_df[['bydde', 'byrke', 'byyfk', 'byyinfk', 'byysp', 'wsfp', 'xyyjyfk']].apply(pd.to_numeric)

    #获取品牌和产品管理员对应关系
    gys_cpgly_dict = fetch_gys_cpgly()

    #今年本月
    this_month = get_month(this_month_end)
    #查询本年度本月的
    month_cond = f'tjmonth==["{this_month}"]'
    this_year_this_month_df = PandasHelper.df_query(target_full_df, month_cond)
    #判断this_year_this_month_df是否能查询到，不为空，分组计算，否则为None
    #bydde,  byrke,byyfk, byyinfk,  byysp, wsfp, xyyjyfk
    this_year_this_month_group_df = this_year_this_month_df.groupby('pjcode')['bydde','byrke','byyfk',
                                                                              'byyinfk','byysp','wsfp','xyyjyfk'].sum() if not this_year_this_month_df.empty else pd.DataFrame()

    #本年到目前为止的金额统计
    # 查询本年度本月的
    this_year_start_month = get_month(this_year_start)
    month_cond = (target_full_df['tjmonth'] >= this_year_start_month) & (
                target_full_df['tjmonth'] <= this_month)
    this_year_this_month_df = PandasHelper.df_cond_filter(target_full_df, month_cond)
    # bydde,  byrke,byyfk, byyinfk,  byysp, wsfp, xyyjyfk
    this_year_group_df = this_year_this_month_df.groupby('pjcode')['bydde', 'byrke', 'byyfk',
                                                                              'byyinfk', 'byysp', 'wsfp', 'xyyjyfk'].sum() if not this_year_this_month_df.empty else pd.DataFrame()

    #获取基础信息
    target_chtjcp_base_df = target_full_df[['pjcode','sname', 'kqtype', 'pp', 'paytype']].drop_duplicates()   #获取待分析的品牌，产品经理，产品助理
    target_code_series = target_full_df['pjcode'].drop_duplicates()    #获取唯一参考

    #获取欠款信息
    lastyear_qk_dict = fetch_lastyear_ljqk()

    df_data_list = []
    for pjcode  in  target_code_series:
        base_df = target_chtjcp_base_df.query(f'pjcode==["{pjcode}"]')
        sname = base_df['sname'].values[0]
        kqtype = base_df['kqtype'].values[0]
        pp = base_df['pp'].values[0]
        paytype = base_df['paytype'].values[0]   #支付币别（人民币，美金）
        #获取本年本月订单额
        this_year_this_month_bydde = 0  if this_year_this_month_group_df.empty else this_year_this_month_group_df['bydde'].get(pjcode, 0)
        this_year_bydde = 0 if this_year_group_df.empty else this_year_group_df['bydde'].get(pjcode,0)


        # 获取本月入库额
        this_year_this_month_byrke =  0   if   this_year_this_month_group_df.empty else   this_year_this_month_group_df['byrke'].get(pjcode,0)
        this_year_byrke  = 0 if this_year_group_df.empty else this_year_group_df['byrke'].get(pjcode, 0)

        # 获取本月已付款
        this_year_this_month_byyfk = 0 if this_year_this_month_group_df.empty else \
                            this_year_this_month_group_df['byyfk'].get(pjcode,0)
        this_year_byyfk = 0 if this_year_group_df.empty else this_year_group_df['byyfk'].get(pjcode, 0)


        # 获取本月应付款
        this_year_this_month_byyinfk= 0 if this_year_this_month_group_df.empty else \
            this_year_this_month_group_df['byyinfk'].get(pjcode, 0)
        this_year_byyinfk = 0 if this_year_group_df.empty else this_year_group_df['byyinfk'].get(pjcode, 0)

        # 获取本月已收票
        this_year_this_month_byysp = 0 if this_year_this_month_group_df.empty else \
            this_year_this_month_group_df['byysp'].get(pjcode,0)
        this_year_byysp = 0 if this_year_group_df.empty else this_year_group_df['byysp'].get(pjcode, 0)


        # 获取本月未收票
        this_year_this_month_wsfp = 0 if this_year_this_month_group_df.empty else \
            this_year_this_month_group_df['wsfp'].get(pjcode, 0)
        this_year_wsfp = 0 if this_year_group_df.empty else this_year_group_df['wsfp'].get(pjcode, 0)

        # 获取下月预计应付款
        this_year_this_month_xyyjyfk = 0 if this_year_this_month_group_df.empty else \
            this_year_this_month_group_df['xyyjyfk'].get(pjcode, 0)
        this_year_xyyjyfk = 0 if this_year_group_df.empty else this_year_group_df['xyyjyfk'].get(pjcode, 0)

        #产品管理员
        cpgly = gys_cpgly_dict.get(sname, '')

        #上年年末欠款
        last_year_qk = lastyear_qk_dict.get(pjcode, 0)
        if last_year_qk != 0:
            last_year_qk = last_year_qk[1]    if  the_year == 2019  else last_year_qk[0]

        #一条记录
        if (this_year_byrke == 0) and (this_year_byyfk == 0) and (this_year_byysp == 0) and (this_year_wsfp == 0) and (this_year_xyyjyfk ==0):
            continue
        item_tuple = (pjcode, sname, kqtype, cpgly, last_year_qk,
                      this_year_bydde,this_year_this_month_bydde,this_year_byrke,
                      this_year_this_month_byrke,this_year_byyinfk,this_year_byyfk,
                      this_year_this_month_byyfk,this_year_this_month_byyinfk,this_year_byysp,
                      this_year_this_month_byysp,this_year_this_month_wsfp,
                      this_year_this_month_xyyjyfk)
        df_data_list.append(item_tuple)


    #说明：此处的columns列一定要和上述item_tuple顺序对应上
    columns = ["核算项目代码", "核算项目名称", "款期", "产品管理员", "2018年年末欠款（期初数据）",
               "本年度订单额", "本月订单额", "本年度入库额", "本月入库额", "本年累计应付款","本年累计已付款",
               "本月已付款", "本月应付款", "累计已收票", "本月已收票", "未收发票", "下月预计应付款"]

    k3cgfkds_df = PandasHelper.create_dataframe(data=df_data_list, columns=columns)

    return k3cgfkds_df


def create_df_k3cgfkds_rmb(month, paytype='人民币'):
    #paytype = '人民币'
    k3cgfkds_rmb_df = create_df_k3cgfkds(month, paytype=paytype)
    if k3cgfkds_rmb_df.empty:
        g_wlogger.werror(f"k3cgfkds_dp_main:create_df_k3cgfkds_rmb {paytype} return empty, please check.")
    return k3cgfkds_rmb_df


def create_df_k3cgfkds_mj(month, paytype='美金'):
    k3cgfkds_mj_df = create_df_k3cgfkds(month, paytype=paytype)
    if k3cgfkds_mj_df.empty:
        g_wlogger.werror(f"k3cgfkds_dp_main:create_df_k3cgfkds_mj {paytype} return empty, please check.")
    return k3cgfkds_mj_df

def  k3cgfkds_dp_main(month):
    #1. 由月份获取当月的合并数据，返回dataframe数据集
    #人民币
    paytype = '人民币'
    k3cgfkds_rmb_df = create_df_k3cgfkds(month, paytype=paytype)
    if k3cgfkds_rmb_df.empty:
        g_wlogger.werror(f"k3cgfkds_dp_main:create_df_k3cgfkds {paytype} return empty, please check.")
        return
    #2. 写excel
    PandasHelper.df_to_excel(k3cgfkds_rmb_df, f"k3cgfkds_{paytype}.xls")

    paytype='美金'
    k3cgfkds_rmb_df = create_df_k3cgfkds(month, paytype=paytype)
    if k3cgfkds_rmb_df.empty:
        g_wlogger.werror("fk3cgfkds_dp_main:create_df_k3cgfkds {paytype}  return empty, please check.")
        return
    # 2. 写excel
    PandasHelper.df_to_excel(k3cgfkds_rmb_df, f"k3cgfkds_{paytype}.xls")

    #3. 发送邮件
    subject = f"业务中心统计报表-{month}"  #邮件主题
    mail_msg = "业务中心统计报表-采购付款单"  #邮件主体部分内容，可以写成html格式
    appendix_files = ["k3cgfkds_人民币.xls", "k3cgfkds_美金.xls"]
    email_send_with_appendix_list(subject, mail_msg, appendix_files)


if __name__ == "__main__":
    month = '2019-07'

    k3cgfkds_dp_main(month)

